package com.me.myFramework.aop22.aop112;

import com.me.myFramework.aop22.IBuy;
import com.me.myFramework.aop22.Switch;
import com.me.myFramework.aop22.aop111.advice.method.MethodBeforeAdvice111;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

/**
 * 《AOP-112》：  <br><br>
 *
 * TODO 以下变更点：<ol>
 *     <li>
 *         Advice 和 MethodInterceptor 是强关联的，提供一个 getInterceptor() 根据 Advice类型 创建对应的 MethodInterceptor
 *     </li>
 *     <li>
 *         不重要的修改：把 getProxy() 提取到 ProxyFactory，专门创建代理类
 *     </li>
 *     <li>
 *         不重要的修改：使用 {@link MethodBeforeAdvice Spring Advice} 替换自定义的 {@link MethodBeforeAdvice111 MethodBeforeAdvice}
 *     </li>
 *  </ol>
 *
 * @author ME
 */
public class MyAop112 {

    /**
     * 通过 模板模式 提取增强逻辑：方法执行前、正常返回、异常返回
     */
    public static void main(String[] args) throws Throwable {
        IBuy target = new Switch();

        IBuy proxy = (IBuy) new ProxyFactory112(target, new MethodBeforeAdvice() {
            @Override
            public void before(Method method, Object[] args, Object target) throws Throwable {
                System.out.println("[AOP] 就想看看谁买东西了：" + args[0]);
            }
        }).getProxy();
        proxy.buy("Jack");





        System.out.println("\n----------------------------------------------");
        proxy = (IBuy) new ProxyFactory112(target, new AfterReturningAdvice() {
            @Override
            public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
                System.out.println("[AOP2] 记录购买价格 " + returnValue);
            }
        }).getProxy();
        proxy.buy("Tom");
    }

}
